﻿using System;
using System.Data;
using System.Configuration;
using MySql.Data.MySqlClient;

namespace ENT.GP.Datos.MysqlHelper
{
    public class HelperMySql
    {
        /// <summary>
        /// instancia estatica de la misma clase
        /// </summary>
        private static HelperMySql helpermysql;

        /// <summary>
        /// especificar el comando a ejecutar en la BD, en este caso se especificara el nombre del procedimiento
        /// </summary>
        MySqlCommand comando = new MySqlCommand();

        /// <summary>
        /// se la utiliza para la establecer la conexion con la BD
        /// </summary>
        MySqlConnection conexion = new MySqlConnection();

        /// <summary>
        /// se utiliza para traer los datos de la base de datos
        /// </summary>
        MySqlDataAdapter oda = new MySqlDataAdapter();

        /// <summary>
        /// se utiliza para almacenar el conjunto de datos extraidos de la base de datos
        /// </summary>
        DataSet dsDatos = new DataSet();

        /// <summary>
        /// variable utilizada para recorrer los parametros
        /// </summary>
        int i;

        #region "Patron Singleton"
        /// <summary>
        /// El Contructor esta esta protegido para que no se instancie directamente
        /// </summary>
        public HelperMySql() { }

        /// <summary>
        /// Metodo estatico que permitira acceder a la clase sin instanciar la clase
        /// Se compara que la clase no haya sido instanciada 
        /// <param name="cadena">La cadena de conexion para la BD</param>
        /// <returns></returns>
        public static HelperMySql ObtenerConexion(string cadena)
        {
            if (helpermysql == null)//para identificar si ya existe una instancia del objeto
            {
                helpermysql = new HelperMySql();//se instancia el objeto
                helpermysql.conexion = new MySqlConnection();//se intancia la conexion
                helpermysql.conexion.ConnectionString = cadena;//se establece la cadena de conexion
            }
            helpermysql.conexion = new MySqlConnection();
            helpermysql.conexion.ConnectionString = cadena;
            return helpermysql;//se devuelve una instancia de la claese
        }
        #endregion
        /// <summary>
        /// Este metodo ejecutar un procedimiento almacenado y devuelve un unico valor 
        /// </summary>
        /// <param name="Procemiento">Nombre del procedimiento</param>
        /// <param name="parametros"> Parametros Necesario para el procedimeinto</param>
        /// <param name="opc">0 Identificar que solo se devolvera un unico valor.</param>
        /// <returns></returns>
        public Object EjecutarStoreProcedure(string Procemiento, MySqlParameter[] parametros, int opc)
        {
            Object resp = new Object();
            try//para controlar las excepciones
            {
                comando = new MySqlCommand();//se crea la instancia del comando
                conexion.ConnectionString = ConfigurationManager.AppSettings.Get("ConMYSQL").ToString();
                conexion.Open(); //se abre la conexion
                comando.Connection = conexion; //se agrega la conexion al comando
                comando.CommandText = Procemiento; //se especifica el nombre del procedimiento
                comando.CommandType = CommandType.StoredProcedure;//se establece el tipo de comando, en este caso procedimientoalmacenado
                if (parametros != null)//para identificar si hay parametros
                    for (i = 0; i < parametros.Length; i++) //recorre los parametros que se envias de la capa superior
                        comando.Parameters.Add(parametros[i]);//se agrega los parametros al comando
                resp = comando.ExecuteScalar();//se ejecuta el comando y devuelve un unico valor
                conexion.Close();//se cierra la conexion
            }
            catch
            {
                conexion.Close();//se cierra la conexion
                throw; //enviar la excepcion a la capa superior
            }
            return resp;//se retorna el valor
        }
        public void EjecutarStoreProcedure(string Procemiento, MySqlParameter[] parametros)
        {
            try
            {
                conexion.ConnectionString = ConfigurationManager.AppSettings.Get("ConMYSQL").ToString();
                comando = new MySqlCommand();//se crea la instancia del comando
                conexion.Open(); //se abre la conexion
                comando.Connection = conexion; //se agrega la conexion al comando
                comando.CommandText = Procemiento; //se especifica el nombre del procedimiento
                comando.CommandType = CommandType.StoredProcedure;//se establece el tipo de comando, en este caso procedimientoalmacenado
                if (parametros != null)//para identificar si hay parametros
                    for (i = 0; i < parametros.Length; i++) //recorre los parametros que se envias de la capa superior
                        comando.Parameters.Add(parametros[i]);//se agrega los parametros al comando
                comando.ExecuteNonQuery();//Envia a ejecutar una sentencia a la base, en este caso envia a ejecutar un procedimiento
                conexion.Close();//se cierra la conexion
            }
            catch
            {
                conexion.Close();//se cierra la conexion
                throw;//enviar la excepcion a la capa superior
            }
        }
        public DataSet EjecutarStoreProcedure(MySqlParameter[] parametros, string Procemiento)
        {
            dsDatos = new DataSet();//variable para almacenar los resultados
            try
            {
                conexion.ConnectionString = ConfigurationManager.AppSettings.Get("ConMYSQL").ToString();
                comando = new MySqlCommand();//se crea la instancia del comando
                conexion.Open(); //se abre la conexion
                comando.Connection = conexion; //se agrega la conexion al comando
                comando.CommandText = Procemiento; //se especifica el nombre del procedimiento
                comando.CommandType = CommandType.StoredProcedure;//se establece el tipo de comando, en este caso procedimientoalmacenado
                if (parametros != null)//para identificar si hay parametros
                    for (i = 0; i < parametros.Length; i++) //recorre los parametros que se envias de la capa superior
                        comando.Parameters.Add(parametros[i]);//se agrega los parametros al comando
                oda.SelectCommand = comando;//asocia el comando al dataadapter
                oda.Fill(dsDatos);//envia a ejecutar a la base y el resultado obtenido lo almacena en dsDatos
                conexion.Close();//se cierra la conexion
            }
            catch
            {
                conexion.Close();//se cierra la conexion
                throw;//enviar la excepcion a la capa superior
            }
            return dsDatos;
        }
        public DataSet EjecutarStoreProcedure(string Comando)
        {
            dsDatos = new DataSet();//variable para almacenar los resultados
            try
            {
                conexion.ConnectionString = ConfigurationManager.AppSettings.Get("ConMYSQL").ToString();
                comando = new MySqlCommand();//se crea la instancia del comando
                conexion.Open(); //se abre la conexion
                comando.Connection = conexion; //se agrega la conexion al comando
                comando.CommandText = Comando; //se especifica el nombre del procedimiento
                oda.SelectCommand = comando;//asocia el comando al dataadapter
                oda.Fill(dsDatos);//envia a ejecutar a la base y el resultado obtenido lo almacena en dsDatos
                conexion.Close();//se cierra la conexion
            }
            catch
            {
                conexion.Close();//se cierra la conexion
                throw;//enviar la excepcion a la capa superior
            }
            return dsDatos;
        }


    }

}